<?php

class CobranzasController extends AppController {

    var $name = 'Cobranzas';
    var $uses = array('Cliente');
    var $helpers = array('Formulario', 'Interfaz', 'AjaxAG');
    var $components = array('Interfaz', 'Maestro');
    var $layout = "ajax";

    public function beforeFilter() {
        $this->validar_sesion();
    }
    
    public function afterFilter() {
        $this->auditoria();
    }

    public function busqueda() {
        extract($this->request->data);

        $tiendaSesion = $this->Session->read('tiendaBD');
        $objCarOrd = $this->Maestro->modelo('punto', 'CartaOrden', $tiendaSesion);
        $objNotCre = $this->Maestro->modelo('punto', 'NotaCredito', $tiendaSesion);

        //$tipo
        // 0 PENDIENTES
        // 1 TODAS
        // 2 BLOQUEDAS

        $datosCobranza = $this->Cliente->query("SELECT * FROM cobranzas.fnc_deudas_cliente('$documento', '$tipo') AS (id bigint, tienda character varying(5), numfac character varying(25), fecemi date, monto double precision, pagado double precision, deuda double precision, usuario character(30), estatus bigint, documento character varying(15), sistema integer)");
        
        $objCarOrd->virtualFields['id'] = '4 || \'_\' || CartaOrden.id';
        $objCarOrd->virtualFields['nombre'] = 'CartaOrden.numero || \' | (\' || REPLACE((CartaOrden.monto - CartaOrden.pagado)::text, \'.\', \',\') || \' Bs)\'';
        $listaCartas = $objCarOrd->find('list', array('fields' => 'id, nombre', 'conditions' => array('CartaOrden.estatus' => 1, 'CartaOrden.cliente_id' => $cliente_id), 'order' => '(CartaOrden.monto - CartaOrden.pagado)'));
        
        $objNotCre->virtualFields['id'] = '3 || \'_\' || NotaCredito.id';
        $objNotCre->virtualFields['nombre'] = 'NotaCredito.numero || \' | (\' || REPLACE((NotaCredito.monto - NotaCredito.pagado)::text, \'.\', \',\') || \' Bs)\'';
        $listaNotas = $objNotCre->find('list', array('fields' => 'id, nombre', 'conditions' => array('NotaCredito.estatus' => 1, 'NotaCredito.cliente_id' => $cliente_id), 'order' => '(NotaCredito.monto - NotaCredito.pagado)'));

        // V050244485
        // V005830122
        // V008622779
        // J085070400
        // V196365466
        //pr($datosCobranza);

        $this->set('data', $datosCobranza);
        $this->set('listaCartas', $listaCartas);
        $this->set('listaNotas', $listaNotas);

        if($tipo == '2') {
            $this->render('bloqueada');
        }
    }
    
    public function detalle() {
        extract($this->request->data);
        //$datosCobranza = $objCobranza->query("SELECT * FROM fnc_estatus_clientes('$documento') as v (basedatos text,tienda text,id_sistema integer,sistema text,tipo text, documento text, monto numeric, pago numeric, total numeric)");
        $datosDetalle = $this->Cliente->query("SELECT * FROM cobranzas.fnc_detalle_cobro_factura('$numfac', '$tienda', $sistema) AS (feccobranza date, despcobranza character varying(225), usuario character(30), tienda character varying(5), numcobranza character varying(25), numfactura character varying(25), montocancel double precision, montoporcancel double precision, documento character varying(15), sistema integer)");

        $this->set('data', $datosDetalle);
    }
    
    public function guardar (){
        extract($this->request->data);
        $error = false;
        $exito = 1;
        $cobranza = $cobranzaDetalle = $instrumentoPago = $dataNotasDebito = $dataNotasCredito = $id_notas_deb = $id_notas_cre = $id_notas_credito = array();
        $usuarioID = $this->Interfaz->id($this->Session->read('usuario_id'));
        $tiendaSesion = $this->Session->read('tiendaBD');
        $objCobranza = $this->Maestro->modelo('punto', 'Cobranza', $tiendaSesion);
        $objCobranzaDetalle = $this->Maestro->modelo('punto', 'CobranzaDetalle', $tiendaSesion);
        $objInsPagoCob = $this->Maestro->modelo('punto', 'InstrumentoPagoCobranza', $tiendaSesion);
        $objRetencion = $this->Maestro->modelo('punto', 'RetencionTarjeta', $tiendaSesion);
        $objNotaCredito = $this->Maestro->modelo('punto', 'NotaCredito', $tiendaSesion);
        $objCartaOrden = $this->Maestro->modelo('punto', 'CartaOrden', $tiendaSesion);
        $objNotaDebito = $this->Maestro->modelo('punto', 'NotaDebito', $tiendaSesion);
        $tienda = substr($this->Session->read('codigo_punto'), 1);
        
        $cambio = $this->Interfaz->miles_postgres($cambio);
        $cobranza['usuario_id'] = $usuarioID;
        $cobranza['monto'] = $montoPagar;
        $cobranza['fecha'] = 'now()';
        $cobranza['cliente_id'] = $cliente_id;
        $cobranza['cambio'] = $cambio;
        
        foreach ($forma_pago as $indice => $valor) {
            $monto[$indice] = $this->Interfaz->miles_postgres($monto[$indice]);
        }
        
        $montoNC = $montoND = $monto;
        $referenciaNC = $referenciaND = $referencia;
        $forma_pagoNC = $forma_pagoND = $forma_pago;
        
        $objCobranza->query('BEGIN WORK');
        if ($objCobranza->save($cobranza)) {
            $i = 0;
            foreach($infoFactura as $indice => $valor) {
                foreach($valor as $indice2 => $valor2) {
                    $valor2 = explode('=|=', $valor2);
                    $montoFactura = $this->Interfaz->miles_postgres($montoDeuda[$indice][$indice2]);
                    $cobranzaDetalle[$i]['CobranzaDetalle']['cobranza_id'] = $objCobranza->id;
                    $cobranzaDetalle[$i]['CobranzaDetalle']['sistema'] = $valor2[0];
                    $cobranzaDetalle[$i]['CobranzaDetalle']['tienda'] = $valor2[1];
                    $cobranzaDetalle[$i]['CobranzaDetalle']['factura_id'] = $valor2[2];
                    $cobranzaDetalle[$i]['CobranzaDetalle']['monto'] = $montoFactura;
                    $cobranzaDetalle[$i]['CobranzaDetalle']['nro_factura'] = $valor2[3];
                    
                    if(in_array(4, $forma_pagoND)) {
                        $valor2[4] = $cliente_id;
                        $resultadoND = $this->generarNotaDebito($montoFactura, $valor2, $forma_pagoND, $montoND, $referenciaND, $dataNotasDebito);
                    }
                    
                    if(in_array(5, $forma_pagoNC)) {
                        $valor2[4] = $cliente_id;
                        $resultadoNC = $this->generarNotaCredito($cambio, $valor2, $forma_pagoNC, $montoNC, $referenciaNC, $dataNotasCredito);
                    }
                    $i++;
                }
            }
            
            if ($objCobranzaDetalle->saveAll($cobranzaDetalle)) {
                foreach ($forma_pago as $indice => $valor) {
                    $porcentajeRet = $montoRet = $porcentajeRetIslr = $montoRetIslr = 0;
                    $detalleRetencion = $objRetencion->find('first', array('fields' => array('RetencionTarjeta.porreten', 'RetencionTarjeta.porreten_islr'), 'conditions' => array('RetencionTarjeta.estatus' => 1, 'RetencionTarjeta.formadepago_id' => $valor, 'RetencionTarjeta.banco_id' => $banco[$indice])));

                    if (!empty($detalleRetencion)) {
                        $porcentajeRet = $detalleRetencion['RetencionTarjeta']['porreten'];
                        $montoRet = round($monto[$indice] * ($detalleRetencion['RetencionTarjeta']['porreten'] / 100),2);
                        $porcentajeRetIslr = $detalleRetencion['RetencionTarjeta']['porreten_islr'];
                        //$montoRetIslr = round($monto[$indice] * ($detalleRetencion['RetencionTarjeta']['porreten_islr'] / 100),2);
                        $montoRetIslr = round(($monto[$indice]/112) * $detalleRetencion['RetencionTarjeta']['porreten_islr'],2);
                    }

                    $instrumentoPago[$indice]['InstrumentoPagoCobranza']['cobranza_id'] = $objCobranza->id;
                    $instrumentoPago[$indice]['InstrumentoPagoCobranza']['formapago_id'] = $valor;
                    $instrumentoPago[$indice]['InstrumentoPagoCobranza']['monto'] = $monto[$indice];
                    $numReferencia = explode('_', $referencia[$indice]);

                    if (count($numReferencia) > 1) {
                        if ($numReferencia[0] == 3) { // Nota de credito
                            $instrumentoPago[$indice]['InstrumentoPagoCobranza']['notacredito_id'] = $numReferencia[1];
                            $objNotaCredito->updateAll(array('NotaCredito.pagado' => "NotaCredito.pagado + {$monto[$indice]}", 'NotaCredito.modificado' => "now()"),array('NotaCredito.id' => $numReferencia[1]));                            
                        }elseif($numReferencia[0] == 4){ // Carta Orden
                            $instrumentoPago[$indice]['InstrumentoPagoCobranza']['carta_orden_id'] = $numReferencia[1];
                            $objCartaOrden->updateAll(array('CartaOrden.pagado' => "CartaOrden.pagado + {$monto[$indice]}", 'CartaOrden.modificado' => "now()"),array('CartaOrden.id' => $numReferencia[1]));
                        }
                        $numReferencia = null;
                    } else
                        $numReferencia = (!empty($numReferencia[0])) ? $numReferencia[0] : null;

                    $instrumentoPago[$indice]['InstrumentoPagoCobranza']['referencia'] = $numReferencia;
                    $instrumentoPago[$indice]['InstrumentoPagoCobranza']['banco_id'] = (!empty($banco[$indice])) ? $banco[$indice] : 0;
                    $instrumentoPago[$indice]['InstrumentoPagoCobranza']['porcentaje_ret'] = $porcentajeRet;
                    $instrumentoPago[$indice]['InstrumentoPagoCobranza']['monto_ret'] = $montoRet;
                    $instrumentoPago[$indice]['InstrumentoPagoCobranza']['porcentaje_ret_islr'] = $porcentajeRetIslr;
                    $instrumentoPago[$indice]['InstrumentoPagoCobranza']['monto_ret_islr'] = $montoRetIslr;
                    $instrumentoPago[$indice]['InstrumentoPagoCobranza']['usuario_id'] = $usuarioID;
                }
                
                if($exito) {
                    if ($objInsPagoCob->saveAll($instrumentoPago)) {
                        if(!empty($resultadoND)) {
                            if($objNotaDebito->saveAll($resultadoND)){
                                $id_notas_deb = $objNotaDebito->inserted_ids;
                                foreach ($id_notas_deb as $id_not) {
                                    $res = $objNotaDebito->query("select fn_numero_debito('$tienda', $id_not, {$this->Session->read('punto_id')}) as res");
                                    $resultado2 = $res[0][0]['res'];
                                    if ($resultado2) {
                                        $exito*=1;
                                    } else {
                                        $exito = 0;
                                        $error = true;
                                        $msjError = "Ocurri&oacute; un error al generar los Numeros de las Notas de Debito, favor intente de nuevo";
                                        break;
                                    }
                                }
                            } else {
                                $error = true;
                                $msjError = "Ocurri&oacute; un error al guardar las Notas de Debito, favor intente de nuevo";
                            }
                        }
                        
                        if(!empty($resultadoNC)) {
                            if($objNotaCredito->saveAll($resultadoNC)){
                                $id_notas_cre = $objNotaCredito->inserted_ids;
                                foreach ($id_notas_cre as $id_not) {
                                    $res = $objNotaCredito->query("select fn_numero_credito('$tienda', $id_not, {$this->Session->read('punto_id')}) as res");
                                    $resultado2 = $res[0][0]['res'];
                                    if ($resultado2) {
                                        $exito*=1;
                                    } else {
                                        $exito = 0;
                                        $error = true;
                                        $msjError = "Ocurri&oacute; un error al generar los Numeros de las Notas de Credito, favor intente de nuevo";
                                        break;
                                    }
                                }
                            } else {
                                $error = true;
                                $msjError = "Ocurri&oacute; un error al guardar las Notas de Credito, favor intente de nuevo";
                            }
                        }
                        
                        if($exito) {
                            $objCobranza->query('COMMIT');
                            $this->Cliente->query("SELECT * FROM cobranzas.fnc_facturas_deudas_arauca($cliente_id)
                                                    UNION (SELECT * FROM cobranzas.fnc_notas_arauca($cliente_id))
                                                    UNION (SELECT * FROM cobranzas.fnc_cobranza_arauca($cliente_id))");
                            echo "1_";
                        }
                    } else {
                        $error = true;
                        $msjError = "Ocurri&oacute; un error al guardar los Instrumentos de Pago<br/>de la Cobranza, favor intente de nuevo";
                    }
                }
            } else {
                $error = true;
                $msjError = "Ocurri&oacute; un error al generar el detalle<br/>de la Cobranza, favor intente de nuevo";
            }
        } else {
            $error = true;
            $msjError = "Ocurri&oacute; un error al generar la Cobranza, favor intente de nuevo";
        }
        
        if($error) {
            $objCobranza->query('ROLLBACK');
            echo "2_$msjError";
        }

        $this->autoRender = false;
    }
    
    public function generarNotaDebito($montoFactura, $dataFactura, &$forma_pagoND, &$montoND, &$referenciaND, &$dataNotasDebito) {
        $idCartaOrden = array_search(4, $forma_pagoND);
        if($idCartaOrden !== false) {
            $dataND = array();
            $usuarioID = $this->Interfaz->id($this->Session->read('usuario_id'));
            if($montoND[$idCartaOrden] > $montoFactura) {
                $montoND[$idCartaOrden] = ($montoND[$idCartaOrden] - $montoFactura);
                $montoUsado = $montoFactura;
                $montoFactura = 0;
            } else {
                $montoFactura = ($montoFactura - $montoND[$idCartaOrden]);
                $montoUsado = $montoND[$idCartaOrden];
                unset($forma_pagoND[$idCartaOrden]);
                unset($montoND[$idCartaOrden]);
                unset($referenciaND[$idCartaOrden]);
            }

            $dataND['NotaDebito']['usuario_id'] = $usuarioID;
            $dataND['NotaDebito']['cliente_id'] = $dataFactura[4];
            $dataND['NotaDebito']['tienda_id'] = $this->Interfaz->id($this->Session->read('tienda_id_trabajo'));
            $dataND['NotaDebito']['cierre_caja_id'] = 0;
            $dataND['NotaDebito']['numero'] = '001';
            $dataND['NotaDebito']['nombre'] = 'COBRANZA';
            $dataND['NotaDebito']['monto'] = $montoUsado;
            $dataND['NotaDebito']['doc_referencia'] = $dataFactura[3];
            $dataND['NotaDebito']['id_referencia'] = $dataFactura[2];
            $dataND['NotaDebito']['observacion'] = "NOTA DE DEBITO GENERADA POR CARTA ORDEN UTILIZADA EN COBRANZA BAJO DOCUMENTO NRO $dataFactura[3]";
            $dataND['NotaDebito']['punto_id'] = $this->Session->read('punto_id');
            $dataND['NotaDebito']['sistema'] = (($dataFactura[0] != 3) || ($dataFactura[0] == 3) && ($dataFactura[1] != $this->Session->read('codigo_punto'))) ? 1 : 0;
            $dataNotasDebito[] = $dataND;
        
            if ($montoFactura > 0)
                $this->generarNotaDebito($montoFactura, $dataFactura, $forma_pagoND, $montoND, $referenciaND, $dataNotasDebito);
        }
        return $dataNotasDebito;
    }
    
    public function generarNotaCredito($cambio, $dataFactura, &$forma_pagoNC, &$montoNC, &$referenciaNC, &$dataNotasCredito) {
        $idDeposito = array_search(5, $forma_pagoNC);
        if($idDeposito !== false) {
            $dataNC = array();
            $usuarioID = $this->Interfaz->id($this->Session->read('usuario_id'));
            if($montoNC[$idDeposito] > $cambio) {
                $montoNC[$idDeposito] = ($montoNC[$idDeposito] - $cambio);
                $montoUsado = $cambio;
                $cambio = 0;
            } else {
                $cambio = ($cambio - $montoNC[$idDeposito]);
                $montoUsado = $montoNC[$idDeposito];
                unset($forma_pagoNC[$idDeposito]);
                unset($montoNC[$idDeposito]);
                unset($referenciaNC[$idDeposito]);
            }

            $dataNC['NotaCredito']['usuario_id'] = $usuarioID;
            $dataNC['NotaCredito']['cliente_id'] = $dataFactura[4];
            $dataNC['NotaCredito']['tienda_id'] = $this->Interfaz->id($this->Session->read('tienda_id_trabajo'));
            $dataNC['NotaCredito']['cierre_caja_id'] = 0;
            $dataNC['NotaCredito']['numero'] = '001';
            $dataNC['NotaCredito']['nombre'] = 'COBRANZA';
            $dataNC['NotaCredito']['monto'] = $montoUsado;
            $dataNC['NotaCredito']['doc_referencia'] = $dataFactura[3];
            $dataNC['NotaCredito']['id_referencia'] = $dataFactura[2];
            $dataNC['NotaCredito']['observacion'] = "NOTA DE CREDITO GENERADA POR DEPOSITO UTILIZADO EN COBRANZA BAJO DOCUMENTO NRO $dataFactura[3]";
            $dataNC['NotaCredito']['punto_id'] = $this->Session->read('punto_id');
            $dataNC['NotaCredito']['sistema'] = (($dataFactura[0] != 3) || ($dataFactura[0] == 3) && ($dataFactura[1] != $this->Session->read('codigo_punto'))) ? 1 : 0;
            $dataNotasCredito[] = $dataNC;
        
            if ($cambio > 0)
                $this->generarNotaCredito($cambio, $dataFactura, $forma_pagoNC, $montoNC, $referenciaNC, $dataNotasCredito);
        }
        return $dataNotasCredito;
    }
}
